package com.tqz.rc.server.core;

import com.tqz.rc.api.Instance;
import com.tqz.rc.common.exception.RcException;

import java.util.List;
import java.util.Map;

/**
 * <p>实例操作的接口
 *
 * @author tianqingzhao
 * @since 2021/8/26 13:57
 */
public interface InstanceOperator {

    /**
     * 服务注册。
     *
     * @param namespaceId 命名空间的id。
     * @param instance    实例对象。
     */
    void registerInstance(String namespaceId, Instance instance) throws RcException;

    /**
     * 根据命名空间获取服务集合。
     *
     * @param namespaceId 命名空间
     * @return
     */
    Map<String, Service> selectInsatnces(String namespaceId);

    /**
     * 根据命名空间和服务名称获取实例集合。
     *
     * @param namespaceId 命名空间
     * @param serviceName 服务名称
     * @param groupName   分组名称
     * @return
     */
    List<Instance> selectInsatnces(String namespaceId, String serviceName, String groupName);

    /**
     * 服务端处理客户端心跳续约。
     * 在服务注册后，`Nacos Client` 会维护一个定时心跳来持续通知 `Nacos Server`，
     * 说明服务一直处于可用状态，防止被剔除。默认5s发送一次心跳。
     *
     * @param namespaceId 命名空间
     * @param serviceName 服务名称
     * @param clusterName 集群名称
     * @param ip          实例的ip
     * @param port        实例的端口号
     * @return
     */
    int beat(String namespaceId, String serviceName, String clusterName, String ip, int port);
}
